const path = require("path")
//处理路径

const HtmlWebpackPlugin = require('html-webpack-plugin')
//引入自动生成html的插件


// CommonJS - webpack基于node环境, 对前端的代码进行打包
module.exports = {
    // 入口与出口配置
    entry: "./src/index.js",                                 //入口文件名
    output: {
        path: path.resolve(__dirname, "dist"),           //出口文件的绝对路径
        filename: "bundle.js"                                //出口文件名
    },

    //自动生成HTML文件配置
    plugins: [
        new HtmlWebpackPlugin({
            template: './public/index.html' // 以此为基准生成打包后html文件
        })
    ],

    // 处理css文件配置
    module: {//加载器配置
        rules: [ //数组 loader的规则
            {
                test: /\.css$/, // 匹配所有的css文件，i为忽略大小写

                // ⭐use数组里从右向左运行，先解析打包, 才能使用插入，顺序不能写错

                // 先用 css-loader 让webpack能够识别 css 文件的内容并打包
                // 再用 style-loader 将样式, 把css插入到dom中
                use: ["style-loader", "css-loader"]
            },

            // 处理less文件配置
            {
                test: /\.less$/,
                // 使用less-loader, 让webpack处理less文件, 内置还会用less翻译less代码成css内容
                // 注意: 还要用css-loader和style-loader支持css文件
                use: ["style-loader", "css-loader", 'less-loader']
            },

            // 处理图片文件的配置
            {
                test: /\.(png|jpe?g|gif)$/i, //匹配以png，jpg，gif结尾的文件名，i为不区分大小写
                use: [
                    {
                        loader: 'url-loader',// 文件->base64打包进js中
                        options: {// 如果文件超出此限制就会交给file-loader处理(原封不动改名输出到dist下)
                            limit: 8192, // 1kb=1024b, 8kb=8192b
                        },
                        // 图片->base64, 体积会变大30%
                    },
                ],
            },

            // 处理字体图标的解析
            {
                test: /\.(eot|svg|ttf|woff|woff2)$/i, //识别以eot|svg|ttf|woff|woff2结尾的文件
                use: [
                    {
                        loader: 'url-loader',
                        options: {
                            limit: 2 * 1024,
                            // 配置输出的文件名
                            name: '[name].[ext]',
                            // 配置输出的文件目录
                            outputPath: "fonts/"
                        }
                    }
                ]
            },

            // 使用 Babel 降级处理
            {
                test: /\.m?js$/, // \.只匹配.  匹配.js 匹配.mjs结尾的文件
                exclude: /(node_modules|bower_components)/, // 排除node_module和bower_components文件夹下的js
                // node_modules下的第三方包无需降级处理 (提高babel转义速度)
                // 第三方jquery3.6 - 你本身就没考虑低版本问题
                // 直接下jquery1.8
                use: {
                    loader: 'babel-loader', // wepback+babel转义自己js代码
                    options: {
                        presets: ['@babel/preset-env'] // 预设-支持哪些情况
                    }
                }
            }

        ],
    },
    // 开发环境推荐:
    // mode: "development", // 以开发环境
    // // 开发环境不会压缩到极致, 适用于编写代码的环境 (默认启用sourcemap-记录代码打包之前行数和位置信息)
    // devtool: "cheap-module-source-map" // devtool针对soucemap如何记录代码位置信息的一个配置项

    // .map保存的就是对应文件里代码的打包前位置信息

    // 上线环境推荐:
    mode: "production",
    devtool: "source-map"

};